<?php

if (! defined ( 'BASEPATH' ))
	exit ( 'No direct script access allowed' );
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------


/**
 * CodeIgniter Config Class
 *
 * This class contains functions that enable config files to be managed
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Libraries
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/libraries/config.html
 */
class CI_Config {
	
	var $config = array ();
	var $is_loaded = array ();
	var $_config_paths = array (APPPATH );
	
	/**
	 * Constructor
	 *
	 * Sets the $config data from the primary config.php file as a class variable
	 *
	 * @access   public
	 * @param   string	the config file name
	 * @param   boolean  if configuration values should be loaded into their own section
	 * @param   boolean  true if errors should just return false, false if an error message should be displayed
	 * @return  boolean  if the file was successfully loaded or not
	 */
	function __construct() {
		$this->config = & get_config ();
		log_message ( 'debug', "Config Class Initialized" );
		
		// Set the base_url automatically if none was provided
		if ($this->config ['base_url'] == '') {
			if (isset ( $_SERVER ['HTTP_HOST'] )) {
				$base_url = isset ( $_SERVER ['HTTPS'] ) && strtolower ( $_SERVER ['HTTPS'] ) !== 'off' ? 'https' : 'http';
				$base_url .= '://' . $_SERVER ['HTTP_HOST'];
				$base_url .= str_replace ( basename ( $_SERVER ['SCRIPT_NAME'] ), '', $_SERVER ['SCRIPT_NAME'] );
			} 

			else {
				$base_url = 'http://localhost/';
			}
			
			$this->set_item ( 'base_url', $base_url );
		}
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Load Config File
	 *
	 * @access	public
	 * @param	string	the config file name
	 * @param   boolean  if configuration values should be loaded into their own section
	 * @param   boolean  true if errors should just return false, false if an error message should be displayed
	 * @return	boolean	if the file was loaded correctly
	 */
	function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) {
		$file = ($file == '') ? 'config' : str_replace ( '.php', '', $file );
		$found = FALSE;
		$loaded = FALSE;
		
		foreach ( $this->_config_paths as $path ) {
			$check_locations = defined ( 'ENVIRONMENT' ) ? array (ENVIRONMENT . '/' . $file, $file ) : array ($file );
			
			foreach ( $check_locations as $location ) {
				$file_path = $path . 'config/' . $location . '.php';
				
				if (in_array ( $file_path, $this->is_loaded, TRUE )) {
					$loaded = TRUE;
					continue 2;
				}
				
				if (file_exists ( $file_path )) {
					$found = TRUE;
					break;
				}
			}
			
			if ($found === FALSE) {
				continue;
			}
			
			include ($file_path);
			
			if (! isset ( $config ) or ! is_array ( $config )) {
				if ($fail_gracefully === TRUE) {
					return FALSE;
				}
				show_error ( 'Your ' . $file_path . ' file does not appear to contain a valid configuration array.' );
			}
			
			if ($use_sections === TRUE) {
				if (isset ( $this->config [$file] )) {
					$this->config [$file] = array_merge ( $this->config [$file], $config );
				} else {
					$this->config [$file] = $config;
				}
			} else {
				$this->config = array_merge ( $this->config, $config );
			}
			
			$this->is_loaded [] = $file_path;
			unset ( $config );
			
			$loaded = TRUE;
			log_message ( 'debug', 'Config file loaded: ' . $file_path );
			break;
		}
		
		if ($loaded === FALSE) {
			if ($fail_gracefully === TRUE) {
				return FALSE;
			}
			show_error ( 'The configuration file ' . $file . '.php' . ' does not exist.' );
		}
		
		return TRUE;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Fetch a config file item
	 *
	 *
	 * @access	public
	 * @param	string	the config item name
	 * @param	string	the index name
	 * @param	bool
	 * @return	string
	 */
	function item($item, $index = '') {
		if ($index == '') {
			if (! isset ( $this->config [$item] )) {
				return FALSE;
			}
			
			$pref = $this->config [$item];
		} else {
			if (! isset ( $this->config [$index] )) {
				return FALSE;
			}
			
			if (! isset ( $this->config [$index] [$item] )) {
				return FALSE;
			}
			
			$pref = $this->config [$index] [$item];
		}
		
		return $pref;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Fetch a config file item - adds slash after item (if item is not empty)
	 *
	 * @access	public
	 * @param	string	the config item name
	 * @param	bool
	 * @return	string
	 */
	function slash_item($item) {
		if (! isset ( $this->config [$item] )) {
			return FALSE;
		}
		if (trim ( $this->config [$item] ) == '') {
			return '';
		}
		
		return rtrim ( $this->config [$item], '/' ) . '/';
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Site URL
	 * Returns base_url . index_page [. uri_string]
	 *
	 * @access	public
	 * @param	string	the URI string
	 * @return	string
	 */
	function site_url($uri = '') {
		if ($uri == '') {
			return $this->slash_item ( 'base_url' ) . $this->item ( 'index_page' );
		}
		
		if ($this->item ( 'enable_query_strings' ) == FALSE) {
			$suffix = ($this->item ( 'url_suffix' ) == FALSE) ? '' : $this->item ( 'url_suffix' );
			return $this->slash_item ( 'base_url' ) . $this->slash_item ( 'index_page' ) . $this->_uri_string ( $uri ) . $suffix;
		} else {
			return $this->slash_item ( 'base_url' ) . $this->item ( 'index_page' ) . '?' . $this->_uri_string ( $uri );
		}
	}
	
	// -------------------------------------------------------------
	

	/**
	 * Base URL
	 * Returns base_url [. uri_string]
	 *
	 * @access public
	 * @param string $uri
	 * @return string
	 */
	function base_url($uri = '') {
		return $this->slash_item ( 'base_url' ) . ltrim ( $this->_uri_string ( $uri ), '/' );
	}
	
	// -------------------------------------------------------------
	

	/**
	 * Build URI string for use in Config::site_url() and Config::base_url()
	 *
	 * @access protected
	 * @param  $uri
	 * @return string
	 */
	protected function _uri_string($uri) {
		if ($this->item ( 'enable_query_strings' ) == FALSE) {
			if (is_array ( $uri )) {
				$uri = implode ( '/', $uri );
			}
			$uri = trim ( $uri, '/' );
		} else {
			if (is_array ( $uri )) {
				$i = 0;
				$str = '';
				foreach ( $uri as $key => $val ) {
					$prefix = ($i == 0) ? '' : '&';
					$str .= $prefix . $key . '=' . $val;
					$i ++;
				}
				$uri = $str;
			}
		}
		return $uri;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * System URL
	 *
	 * @access	public
	 * @return	string
	 */
	function system_url() {
		$x = explode ( "/", preg_replace ( "|/*(.+?)/*$|", "\\1", BASEPATH ) );
		return $this->slash_item ( 'base_url' ) . end ( $x ) . '/';
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Set a config file item
	 *
	 * @access	public
	 * @param	string	the config item key
	 * @param	string	the config item value
	 * @return	void
	 */
	function set_item($item, $value) {
		$this->config [$item] = $value;
	}
	
	// --------------------------------------------------------------------
	

	/**
	 * Assign to Config
	 *
	 * This function is called by the front controller (CodeIgniter.php)
	 * after the Config class is instantiated.  It permits config items
	 * to be assigned or overriden by variables contained in the index.php file
	 *
	 * @access	private
	 * @param	array
	 * @return	void
	 */
	function _assign_to_config($items = array()) {
		if (is_array ( $items )) {
			foreach ( $items as $key => $val ) {
				$this->set_item ( $key, $val );
			}
		}
	}
}

// END CI_Config class

/* End of file Config.php */
/* Location: ./system/core/Config.php */
